/**
 * 在这里定义和用户相关的路由处理函数，供 /router/user.js 模块进行调用
 */

/**
 *  导入的包 
 */
//导入数据库操作模块
const db = require('../db/index');

//导入 bcryptjs 这个包
const bcrypt = require('bcryptjs');

//导入生成 Token 的包
const jwt = require('jsonwebtoken');

//导入全局的配置文件
const config = require('../config');

/**
 *  导入的包  结束 
 */



/**
 * 注册用户的处理函数
 */
exports.regUser = (req,res)=>{
    //通过 req.body 获取客户端提交到服务器的用户信息
    const userinfo = req.body;

    //对表单中的数据，进行合法行的效验     用新的方式代替验证
    // if(!userinfo.username  || !userinfo.password){
    //     return res.send({status: 1, message:'用户名或密码不合法'})
    // }
    //定义SQL语句，查询用户名是否被占用
    const sqlStr = 'select * from ev_users where username=?';
    //使用 db.query() 执行SQL语句
    db.query(sqlStr, userinfo.username, (err,data) =>{
        //执行SQL语句失败
        // if (err) return res.send({ status: 1, message: err.message })
        if(err) return res.cc(err)

        //判断用户名是否被占用
        if(data.length > 0){
        //   return res.send({status: 1, message:'用户名被占用，请更换其他用户名！'})
       return res.cc('用户名被占用，请更换其他用户名！')           
        } 
        /**
         * 对密码进行加密
         */
        // console.log(userinfo) //加密前
        //调用 bcrypt.hashSync() 对密码进行加密
        userinfo.password = bcrypt.hashSync(userinfo.password, 10)
        //console.log(userinfo)//加密后

        /**
         * 插入 新用户
         */
        //定义插入新用户的SQL语句
        const sql = 'insert into ev_users set ?';
        //调用db.query()执行SQL语句
        db.query(sql,{username:userinfo.username, password:userinfo.password }, (err,data)=>{
            //判断SQL语句是否执行成功
           // if(err) return res.send({status:1, message:err.message});
               if(err) return res.cc(err) 
            //判断影响行数是否为1
            // if(data.affectedRows !== 1) return res.send({status:1, message:'注册用户失败，请稍后再试！'});
            if(data.affectedRows !== 1) return res.cc('注册用户失败，请稍后再试！')
            //注册用户成功
            // res.send({status:0, message:'注册成功！'})
            res.cc('注册成功！', 0)
        })
    })

}


/**
 * 登录的处理函数
 * 
 * 
 * 查找发送过来的用户名是否和数据库的一致
 */
exports.login = (req,res)=>{
    //接收表单数据
    const userinfo = req.body;
    //定义SQL语句
    const sql = 'select * from ev_users where username=?';
    //执行SQL语句，查询用户的数据
    db.query(sql,userinfo.username, (err,data)=>{
        //执行SQL语句失败
        if(err) return res.cc(err);
        //执行SQL语句成功，但是查询到数据条数不等于1
        if(data.length !==1) return res.cc('登录失败！')       

        /** 
         * // 拿着用户输入的密码,和数据库中存储的密码进行对比
        */
       //注意：要先重新注册在进行登录
        const compareData = bcrypt.compareSync(userinfo.password, data[0].password);
       // 如果对比的结果等于 false, 则证明用户输入的密码错误
        if(!compareData) {
             res.cc('登录失败！')
        }

        /**
         * 在服务器端生成 Token 的字符串
         * 
         * // 剔除完毕之后，user 中只保留了用户的 id, username, nickname, email 这四个属性的值
             ... 展开运算符
        */
       const user = {...data[0], password:'', user_pic:''};
      
       //对用户的信息进行加密，生成 Token 字符串
       const tokenStr = jwt.sign(user, config.jwtSecretKey, {expiresIn: config.expiresIn})
       
       //调用res.send() 将 Token 响应给客户端
       res.send({
        status:0,
        msg:'登录成功',
        token: 'Bearer '
            +  tokenStr
       })
   
   
   
    }) 
  
    
    
}